// Copyright 2013 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package adwords.axis.v201209.campaignmanagement;

import com.google.api.ads.adwords.axis.factory.AdWordsServices;
import com.google.api.ads.adwords.axis.v201209.cm.Campaign;
import com.google.api.ads.adwords.axis.v201209.cm.CampaignOperation;
import com.google.api.ads.adwords.axis.v201209.cm.CampaignReturnValue;
import com.google.api.ads.adwords.axis.v201209.cm.CampaignServiceInterface;
import com.google.api.ads.adwords.axis.v201209.cm.Operator;
import com.google.api.ads.adwords.axis.v201209.cm.String_StringMapEntry;
import com.google.api.ads.adwords.lib.client.AdWordsSession;
import com.google.api.ads.common.lib.auth.ClientLoginTokens;
import com.google.api.ads.common.lib.utils.Maps;
import com.google.common.collect.ImmutableMap;

import java.util.Map;

/**
 * This example sets the enhanced bit in a given campaign using the forward
 * compatibility map attribute.
 * To get campaigns, run basicoperations/GetCampaigns.java. 
 *
 * Credentials and properties in {@code fromFile()} are pulled from the
 * "ads.properties" file. See README for more info.
 *
 * Tags: CampaignCriterionService.mutate
 *
 * @author Kevin Winter
 */
public class SetCampaignEnhanced {
  
  public static void main(String[] args) throws Exception {
    // Get a ClientLogin AuthToken.
    String clientLoginToken = new ClientLoginTokens.Builder()
        .forApi(ClientLoginTokens.Api.ADWORDS)
        .fromFile()
        .build()
        .requestToken();

    // Construct an AdWordsSession.
    AdWordsSession session =
        new AdWordsSession.Builder().fromFile().withClientLoginToken(clientLoginToken).build();

    Long campaignId = Long.valueOf("INSERT_CAMPAIGN_ID_HERE");

    AdWordsServices adWordsServices = new AdWordsServices();

    runExample(adWordsServices, session, campaignId);
  }

  public static void runExample(
      AdWordsServices adWordsServices, AdWordsSession session, Long campaignId) throws Exception {
    // Get the CampaignService.
    CampaignServiceInterface campaignService =
        adWordsServices.get(session, CampaignServiceInterface.class);
    
    // Campaign to be updated with the enhanced value.
    // Note: After setting the enhanced value to true, setting it back to false
    // will generate an ApiError.
    Campaign campaign = new Campaign();
    campaign.setId(campaignId);
    campaign.setForwardCompatibilityMap(
        Maps.toArray(ImmutableMap.of("Campaign.enhanced", "true"), new String_StringMapEntry[0]));
    
    // Create operation.
    CampaignOperation operation = new CampaignOperation();
    operation.setOperand(campaign);
    operation.setOperator(Operator.SET);
    
    // Change campaign.
    CampaignReturnValue result = campaignService.mutate(new CampaignOperation[] {operation});
    for (Campaign campaignResult : result.getValue()) {
      Map<String, String> forwardCompatibilityMap =
          Maps.toMap(campaignResult.getForwardCompatibilityMap());
      System.out.printf("Campaign with ID %d has been set enhanced to '%s'.\n", campaign.getId(),
          forwardCompatibilityMap.get("Campaign.enhanced"));
    }
  }
}
